#!/usr/bin/env python
# -*- coding: utf-8 -*-

import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
import os

# 使用指定的绝对路径
csv_path = '/home/zkh/lzt/damoxing/boshuyuce/xindaoyuce/time_id_rmse_results.csv'

if not os.path.exists(csv_path):
    print(f"错误: 找不到文件 {csv_path}")
    # 尝试在其他位置查找
    alt_paths = [
        os.path.join(os.path.dirname(os.path.abspath(__file__)), 'time_id_rmse_results.csv'),
        'time_id_rmse_results.csv'
    ]
    for path in alt_paths:
        if os.path.exists(path):
            csv_path = path
            print(f"使用替代文件路径: {csv_path}")
            break
    
    # 如果还是找不到，使用glob查找
    if not os.path.exists(csv_path):
        import glob
        potential_files = glob.glob("**/time_id_rmse_results.csv", recursive=True)
        if potential_files:
            print(f"找到以下可能的文件: {potential_files}")
            csv_path = potential_files[0]
            print(f"使用文件: {csv_path}")
        else:
            print("请先运行training脚本以生成RMSE结果文件!")
            exit(1)

# 加载数据
df = pd.read_csv(csv_path)
print(f"成功读取数据: {len(df)} 条记录")

# 对时间点ID进行排序以按时间顺序显示
# 确保time_id列为数值型
df['time_id'] = pd.to_numeric(df['time_id'], errors='coerce')
# 移除任何无法转换为数值的记录
df = df.dropna(subset=['time_id'])
# 按time_id排序
df = df.sort_values('time_id')

# 获取唯一的时间点ID并排序
time_ids = df['time_id'].values
rmse_values = df['rmse'].values

# 创建图表
plt.figure(figsize=(15, 8))
plt.plot(time_ids, rmse_values, 'b-', alpha=0.7)
plt.scatter(time_ids, rmse_values, c=rmse_values, cmap='viridis', alpha=0.7)

# 添加标题和标签
plt.title('各时间点的RMSE值分布', fontsize=16)
plt.xlabel('时间点ID', fontsize=14)
plt.ylabel('RMSE值', fontsize=14)
plt.grid(True, alpha=0.3)

# 添加颜色条
cbar = plt.colorbar()
cbar.set_label('RMSE值', fontsize=12)

# 高亮显示前10个最高RMSE值的点
top_n = 10
top_df = df.sort_values('rmse', ascending=False).head(top_n)
plt.scatter(top_df['time_id'], top_df['rmse'], c='red', s=100, alpha=0.7, label=f'前{top_n}高RMSE')

# 为高亮显示的点添加标签
for i, row in top_df.iterrows():
    plt.annotate(f"ID:{int(row['time_id'])}\nRMSE:{row['rmse']:.4f}",
                 (row['time_id'], row['rmse']),
                 textcoords="offset points",
                 xytext=(0, 10),
                 ha='center',
                 fontsize=9,
                 bbox=dict(boxstyle="round,pad=0.3", fc="white", alpha=0.8))

# 添加图例
plt.legend(loc='upper right')

# 保存图表
output_dir = os.path.dirname(csv_path)
output_path = os.path.join(output_dir, 'rmse_by_time.png')
plt.tight_layout()
plt.savefig(output_path, dpi=300)
plt.savefig(os.path.join(output_dir, 'rmse_by_time.pdf'))  # 同时保存PDF版本供发表使用
print(f"图表已保存至: {output_path}")

# 创建另一个按RMSE从大到小排序的柱状图
plt.figure(figsize=(15, 8))

# 对数据按RMSE从大到小排序
sorted_df = df.sort_values('rmse', ascending=False)
top_df = sorted_df.head(50)  # 只取前50个最高的

plt.bar(range(len(top_df)), top_df['rmse'], alpha=0.7)
plt.xticks(range(len(top_df)), top_df['time_id'].astype(int), rotation=90, fontsize=8)

# 添加标题和标签
plt.title('RMSE最高的50个时间点', fontsize=16)
plt.xlabel('时间点ID', fontsize=14)
plt.ylabel('RMSE值', fontsize=14)
plt.grid(True, alpha=0.3)

# 保存图表
output_path2 = os.path.join(output_dir, 'top_rmse_by_time.png')
plt.tight_layout()
plt.savefig(output_path2, dpi=300)
plt.savefig(os.path.join(output_dir, 'top_rmse_by_time.pdf'))  # 同时保存PDF版本
print(f"排序图表已保存至: {output_path2}")

# 额外创建一个RMSE分布直方图
plt.figure(figsize=(12, 6))
plt.hist(df['rmse'], bins=50, alpha=0.7, color='blue')

# 添加标题和标签
plt.title('RMSE值分布直方图', fontsize=16)
plt.xlabel('RMSE值', fontsize=14)
plt.ylabel('频率', fontsize=14)
plt.grid(True, alpha=0.3)

# 保存图表
output_path3 = os.path.join(output_dir, 'rmse_histogram.png')
plt.tight_layout()
plt.savefig(output_path3, dpi=300)
print(f"直方图已保存至: {output_path3}")

print("可视化完成！") 